package infixupn;

/* Der folgende Stack kann mehr, als man für das Ausrechnen von gegebenen
 * UPN-Strings braucht. Er kann nämlich sogar Strings speichern, womit er
 * sogar für die Erzeugung von UPN aus Infix verwendet werden kann.*/

public class Stack{
  private Knoten head;

  public Stack(){ head=null; }

  public boolean empty(){ return head==null; }

  public boolean numberNext(){ return !empty() && head.hasZahl(); }

  public void push(double zahl){
    Knoten neu=new Knoten(zahl);
    neu.next=head;
    head=neu;
  }

  public void push(String text){
    Knoten neu=new Knoten(text);
    neu.next=head;
    head=neu;
  }

  public double pullDouble() throws KeineZahlException{
    if(!numberNext()) throw new KeineZahlException();
    double wert=head.zahl;
    head=head.next;
    return wert;
  }

  public String pullString() throws KeinStringException{
    if(empty() || numberNext()) throw new KeinStringException();
    String wert=head.text;
    head=head.next;
    return wert;
  }

  // Die folgende Methode muss nicht verstanden werden
  public String toString(){
    StringBuilder sb=new StringBuilder();
    Knoten lauf=head;
    while(lauf!=null){
      if(lauf.hasZahl()) sb.append(lauf.zahl);
      else sb.append(lauf.text);
      sb.append(" ");
      lauf=lauf.next;
    }
    return sb.toString();
  }
}

// man kann in einer Datei mehrere Klassen deklarieren. Faulheit...
// Solche Klassen dürfen dann aber nicht public sein.
class KeineZahlException extends RuntimeException{
  public KeineZahlException(){ super(); }
}

class KeinStringException extends RuntimeException{
  public KeinStringException(){ super(); }
}

class NixDrinException extends RuntimeException{
  public NixDrinException(){ super(); }
}
